#ifndef _CRYPT_H_
#define _CRYPT_H_

#include "openssl/aes.h"
#include "openssl/sha.h"
#include "openssl/rsa.h"
#include "openssl/err.h"
#include "openssl/pem.h"


//aes初始向量和密钥长度
#define IVEC "1111222233334444"
#define AES_KEY_LEN 256

//随机生成aes密钥
void random_generate_aeskey(char *key, int len);
//根据口令生成aes密钥
void generate_aeskey_by_passwd(char *password,size_t password_len,char *key);
//aes加密，返回密文长度
int aes_encrypt(const char *src,size_t src_len,char *to,const char *key,char *ivec);
//aes解密，成功返回0失败返回-1
int aes_decrypt(const char *src,size_t src_len,char *to,const char *key,char *ivec);


//rsa的密钥长度和默认填充方式
#define RSA_KEY_LENGTH 2048
#define RSA_PADDING RSA_PKCS1_PADDING

//基于口令生成公钥文件和私钥文件，成功返回0失败返回-1
int rsa_generate_key_files(const char *pub_key_filename,const char *priv_key_filename,const char *passwd);
//从rsa密钥文件中读取公钥或私钥
int read_key_file(const char *filename,char *buf);
//调用私钥文件时的回调函数，向用户请求私钥口令
int rsa_pom_passwd_callback(char * buf, int max_len, int flag, void *ctx);
//使用公钥或私钥构造RSA对象用于加解密
RSA* rsa_create_RSA(const char* key, int pub_flag);
//公钥加密
int rsa_pub_encrypt(const char *src, size_t src_len, char *to, const char *pub_key);
//私钥解密
int rsa_priv_decrypt(const char *src, size_t src_len, char *to, const char *priv_key);
//私钥加密
int rsa_priv_encrypt(const char *src, size_t src_len, char *to, const char *priv_key);
//公钥解密
int rsa_pub_decrypt(const char *src, size_t src_len, char *to, const char *pub_key);


//打印最近一次openssl加解密操作发生的错误
void openssl_log_error();
//求文件的hash
int sha256_file(char *path,char *hash);

#endif
